package lanqiao.真题.第13届决赛JavaB组;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec 在平时使用电脑的过程中，经常会打开各种各样的窗口，各个窗口会在桌面上重叠，并按照一定的层次关系显示。
 * 有的窗口能够看到全部内容，而有的窗口只能看到局部。
 * 现在给定一组操作桌面窗口的过程序列，请你通过ASCⅡ艺术图来绘制最后桌面的状态。
 * 已知桌面的大小为N×M,即桌面高度为N个像素，宽度为M个像素，其中左上角坐标为(0,0)，右下角坐标为(N-1,M-1)。
 * 对于窗口的操作有如下5种：
 * 1.new操作-打开一个新窗口
 * new [PID] [top] [left] [height] [width]
 * 如：new 12 20 30 80 100
 * 表示打开一个PID为12的窗口，窗口左上角的坐标为(20,30)，该窗口宽
 * 度为100个像素，高度为80个像素：新创建的窗口，其层级为顶层。
 * <p>
 * 2.move操作-移动一个窗口
 * move [PID] [vertical] [horizontal]
 * 如：mowe 12 -5 10
 * 表示将P1D为12的窗口在垂直方向上移动-5个像素，在水平方向上移 动10个像素。
 * 若窗口左上角原位置为(20,30)，此时则在(15,40)：移动后的窗 口，其层级为顶层。
 * <p>
 * 3.resize操作-改变窗口大小
 * resize [PID] [height] [width]
 * <p>
 * 如：resize1290110
 * 表示保持左上角坐标不变的情况下，改变PD为12的窗口大小，调整为高度90像素，宽度110像素：改变大小后的窗口，其层级为顶层。
 * 4.close操作-关闭窗口
 * close [PID]
 * 如：close12
 * 表示关闭PID为12的窗口
 * 5.active操作-激活窗口
 * active [PID]
 * 如：active 12
 * 表示微活PID为12的窗口，此时该窗口的层级被置为顶层。
 * <p>
 * 【输入格式】
 * 第1行：2个正整数N,M,表示桌面大小
 * 第2行：1个正整数K,表示操作序列的长度
 * 第3..K+2行：每行一个操作，格式见题目描述。
 * 【输出格式】
 * 第1..N行：每行M个字符，仅包含'.'，'+'，'-'，'|'，' '五种字符。
 * '.'表示桌面背景，即该部分未被任何窗口覆盖，‘+’表示窗口的四个角，'-'表示窗口的横边，
 * '|'表示窗口的竖边，' '表示窗口内部。
 * <p>
 * 【样例输入】
 * 7 10
 * 8
 * new 1 0 3 2 5
 * new 2 4 4 2 5
 * new 3 3 3 4 6
 * resize 3 3 6
 * move 1 0 5
 * close 2
 * new 4 1 1 3 5
 * active 3
 * 【评测用例规模与约定】
 * 对于100%的数据，1≤N,M≤256,1≤K≤10000.
 * 输入数据保证：
 * 1.同一时间不会有两个相同PID的窗口存在，可能存在关闭某个PID的
 * 窗口后，再新建一个同样PID的窗口，PID的取值范1≤PID≤100000。
 * 2.同时存在的窗口数量不超过200个。
 * 3.窗口尺寸不会小于2×2，即窗口高度和宽度均不会小于2，不会大于
 * NXM。
 * 4.窗口在移动过程中，可能有部分界面超出桌面显示范围：
 * 5.所有输入的数值均不超过±100000。
 * 6.move resize close只会对未关闭的窗口操作。
 * @since 2023-05-28 22:41
 */
public class D_窗口 {
}

class MainD {
    static int n, m, k;
    static int pid;
    static int top, left, height, width;
    static int vertical, horizontal;
    static char[][] desktop; //桌面
    //记录打开窗口的层级关系，靠后的越顶置
    static List<Integer> pids = new ArrayList<>();
    //记录窗口状态 windows[i][0] 表示pid=i的窗口状态。0-不存在 1-打开 2-关闭
    //windows[i][1]-x    windows[i][2]-y  windows[i][3]-h  windows[i][4]-w
    static int[][] windows = new int[100001][5];
    /*
            y
    |-------->
    |
   X|

     */

    //窗口顶置：将pid移到list最后
    static void moveToTop(int pid){
        int index = 0;
        while(index < pids.size() && pids.get(index) != pid){
            index++;
        }
        pids.remove(index);
        pids.add(pid);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        desktop = new char[n][m];
        k = sc.nextInt();
        String operator;
        for (int i = 0; i < k; i++) {
            operator = sc.next();
            pid = sc.nextInt();
            if (operator.equals("new")) {
                top = sc.nextInt();
                left = sc.nextInt();
                height = sc.nextInt();
                width = sc.nextInt();
                //记录窗口状态
                windows[pid][0] = 1;
                windows[pid][1] = top;
                windows[pid][2] = left;
                windows[pid][3] = height;
                windows[pid][4] = width;
                //窗口顶置
                if(!pids.contains(pid)){//如果pid窗口不存在
                    pids.add(pid);//添加后面（顶置）
                }else{
                    moveToTop(pid);//顶置
                }
            } else if (operator.equals("move")) {
                vertical = sc.nextInt();
                horizontal = sc.nextInt();
                //改变窗口位置
                windows[pid][1] += vertical;
                windows[pid][2] += horizontal;
                //窗口顶置
                moveToTop(pid);
            } else if (operator.equals("resize")) {
                height = sc.nextInt();
                width = sc.nextInt();
                //改变窗口大小
                windows[pid][3] = height;
                windows[pid][4] = width;
                //窗口顶置
                moveToTop(pid);
            } else if (operator.equals("close")) {
                windows[pid][0] = 0;
            } else {//active
                windows[pid][0] = 1;
                //窗口顶置
                moveToTop(pid);
            }
        }
        //空桌面
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                desktop[i][j] = '.';
            }
        }

        //打印窗口
        for(int pid : pids){
            int[] window = windows[pid];
            int x = window[1], y = window[2], h = window[3], w = window[4];
            if(window[0] == 1){ //当期窗口处于打开状态
                //窗口的每个像素点
                for(int i = x; i < x + h; i++){
                    for(int j = y; j < y + w; j++){
                        if(check(i, j)){    //像素点处于窗口内
                            if(i == x || i == x + h - 1){   //上下边
                                if(j == y || j == y + w - 1){   //四角
                                    desktop[i][j] = '+';
                                }else{
                                    desktop[i][j] = '-';    //上下边
                                }
                            }else if(j == y || j == y + w - 1){
                                desktop[i][j] = '|';    //左右边
                            }else{
                                desktop[i][j] = ' ';    //窗口内
                            }
                        }
                    }
                }
            }
        }
        printDesktop();
    }
    static void printDesktop(){
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                System.out.print(desktop[i][j]);
            }
            System.out.println();
        }
    }
    static boolean check(int x, int y){
        return x >= 0 && x < n && y >= 0 && y < m;
    }
}
